#pragma once

#include <chrono>
#include <iostream>
#include <stdint.h>
#include <ctime>
namespace util::time
{
/**
 * @brief 获取10位数的时间戳，秒级
 */
uint64_t GetTimeStamp();

uint64_t GetTimeStampMs();

/**
 * @brief 获取当前时间
 */
std::string GetCurrentTimeStr(bool ms = false, const char* format = "%Y-%m-%d %H:%M:%S");

/**
 * @brief 获取当前时间到until_time的毫秒数
 */
long long GetMillisecondsUntil(const std::string& until_time);

uint64_t GetMillisecondsToMidnight();
// 解析输入时间字符串 "2024-11-08T14:40:04Z" 转为 "2024-11-08 14:40:04.000"，参数2: "%Y-%m-%dT%H:%M:%SZ"
// 解析输入时间字符串 "2024-12-26T18:02:57.017597+0800" 转为 "2024-11-08 14:40:04.000"，参数2: "%Y-%m-%dT%H:%M:%S"
// ....
std::string ConvertTimestamp(const std::string& input, const std::string& fm = "%Y-%m-%dT%H:%M:%S");
// 打印时间点为字符串，debug使用
std::string TimePointToString(const std::chrono::system_clock::time_point& tp);

// 格式化时间转为timepoint
std::chrono::system_clock::time_point FormatTimeToTimePoint(const std::string& timeStr);

// 计算指定时间的未来周期时间
long long CalculateNextExecutionTime(const std::string& firstExecTime, int periodValue /*多少个单位*/,
                                     const std::string& periodUnit /*周期单位*/);

std::string GetNowSubMilli(uint64_t milli);

bool SetSystemTimeFromMillis(int64_t time_millis);

std::string GetTimeStringFromTimestamp(time_t time_stamp);

std::string GetOffsetTime(int hours_offset, int min_offset, const char* format = "%Y-%m-%d");
// 正则表达式匹配 yyyy-MM-dd HH:mm:ss 格式
bool IsValidDateTime(const std::string& dateTime);

long long ConvertToMilliseconds(const std::string& timeStr);

std::string TimestampToString(std::time_t timestamp);
//获取程序编译时间
std::string GetCompileTime();
}  // namespace util::time